<?php


namespace app\servers;

use GatewayWorker\BusinessWorker;
use GatewayWorker\Lib\Gateway;
use think\facade\Cache;

class MyEvent
{

    //当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次。
    public static function onWorkerStart(BusinessWorker $businessWorker)
    {
        echo "====onWorkerStart===".PHP_EOL;
    }

   //当客户端连接上gateway进程时(TCP三次握手完毕时)触发的回调函数。
    public static function onConnect($client_id){
        echo "==onConnect==client_id:$client_id==".PHP_EOL;
    }

    //当客户端连接上gateway完成websocket握手时触发的回调函数
    public static function onWebSocketConnect(string $client_id, array $data)
    {
        echo "===onWebSocketConnect==client_id:$client_id".PHP_EOL;
        var_dump($data);
        $token = $data["get"]['token'];
        $user_id = decrypt($token,config('chat.key'));
        Gateway::bindUid($client_id,$user_id);
//        Gateway::sendToUid($user_id,"你好啊");
    }

    //接收到消息
    public static function onMessage($client_id,$data)
    {
        echo "===onMessage==client_id:$client_id===messgae:$data".PHP_EOL;
        $data = json_decode($data,true);
        if($data && $data['type']=='chatMessage'){

            //聊天记录
            $chatlog["username"] =  $data['data']['mine']['username']; //消息来源用户名
            $chatlog["id"] = $data['data']['mine']['id'];//消息的来源ID （如果是私聊，则是用户id，如果是群聊，则是群组id）
            $chatlog["avatar"] = $data['data']['mine']['avatar']; //消息来源用户头像
            $chatlog["timestamp"] = time()*1000;//是否我发送的消息，如果为true，则会显示在右方
            $chatlog["content"] = $data['data']['mine']['content'];//消息内容
            $uids[] = $data['data']['mine']['id'];
            $uids[] = $data['data']['to']['id'];
            sort($uids);
            $redis = Cache::store('redis')->handler();
            $redis->rPush("chat:{$uids[0]}:{$uids[1]}",json_encode($chatlog,JSON_UNESCAPED_UNICODE));

            //聊天消息
            $info["username"] = $data['data']['mine']['username']; //消息来源用户名
            $info["avatar"] = $data['data']['mine']['avatar']; //消息来源用户头像
            $info["id"] = $data['data']['mine']['id'];//消息的来源ID （如果是私聊，则是用户id，如果是群聊，则是群组id）
            $info["type"] = $data['data']['to']['type']; //聊天窗口来源类型，从发送消息传递的to里面获取
            $info["content"] = $data['data']['mine']['content'];//消息内容
            $info["cid"] = 0; //消息id，可不传。除非你要对消息进行一些操作（如撤回）
            $info["mine"] = false;//是否我发送的消息，如果为true，则会显示在右方
            $info["fromid"] = $data['data']['mine']['id'];//消息的发送者id（比如群组中的某个消息发送者），可用于自动解决浏览器多窗口时的一些问题
            $info["timestamp"] = time()*1000;//是否我发送的消息，如果为true，则会显示在右方
            //发送消息
            Gateway::sendToUid($data['data']['to']['id'],json_encode($info));
        }
    }

    public static function onClose(string $client_id)
    {
        echo "===onClose==client_id:$client_id".PHP_EOL;
    }

    public static function onWorkerStop(BusinessWorker $businessWorker)
    {
        echo "===onWorkerStop==".PHP_EOL;
    }






}